package com.cskaoyan.javase.array._7yanghui;

import java.util.Arrays;

/**
 * 杨辉三角（YangHui Triangle）指的是南宋时期数学家杨辉，根据北宋时期的数学家贾宪的作品（现已遗失），发现的一种几何排列规律，在数学中，它是二项式系数在三角形中的一种几何排列。大致图案如下：
 *
 * 1
 * 1 1
 * 1 2 1
 * 1 3 3 1
 * 1 4 6 4 1
 * 1 5 10 10 5 1
 * ........
 *
 * 在欧洲，这个表叫做帕斯卡三角形（Pascal's Triangle），法国数学家布莱士·帕斯卡（Blaise Pascal ）在1654年发现这一规律，相比于中国，比杨辉要迟393年，比贾宪迟600年。（重铸中华民族的荣光，吾辈义不容辞。）
 *
 * 用二维数组打印杨辉三角，主要是把杨辉三角的图案放进二维数组中
 * 把某一行杨辉三角的数据，当成是一个一维数组，然后杨辉三角整体就是一个二维数组，是一个int类型的二维数组
 *
 * 杨辉三角从纯粹数字规律上来说，就是：
 *      1.每一行的元素和行数一样，即行数等于列数。第一行有一列，第二行有两列....
 *      2.第一行的元素从1开始，且之后每个元素的值，都是上一行同列元素和上一行左边列的元素之和。
 *      3.前两行的元素和每一行的首尾元素由于没有上一行同列元素或上一行左列元素，默认都是1。
 *
 *
 *
 *
 *
 * @since 09:36
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        printYangHui(10);
    }

    // 打印line行数的杨辉三角
    public static void printYangHui(int line) {
        /*
            1.创建出装杨辉三角数据的int类型二维数组
                1.1 这个int类型二维数组应该用何种初始化方式?
                由于每行数据数量都不同,相当于二维数组中的每个一维数组长度都是不一致的,所以不能动态初始化格式1
                必须用动态初始化格式2

                1.2 需要给二维数组中的,每个一维数组初始化
                1.3 至此,杨辉三角的二维数组就已经初始化完毕了,可以开始赋值了

            2.给这个二维数组赋值
                2.1 从第一行开始,一维数组的首尾元素都是1
                2.2 从第三行开始,一维数组中除掉首尾元素的元素的赋值 = 上一行元素 + 上一行左边一列的元素
                如果用二维数组的下标表示arr[i][j]
                arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1];

            3.按照杨辉三角图案的规律打印杨辉三角
         */

        // 1.动态初始化格式2创建杨辉三角二维数组
        // 杨辉三角的行数就表示二维数组的长度
        int[][] yangHui = new int[line][];

        // 2.给二维数组中的,每个一维数组初始化
        for (int i = 0; i < yangHui.length; i++) {
            // 一层for循环遍历二维数组,是遍历二维数组中一维数组的引用
            yangHui[i] = new int[i + 1];
        }

        System.out.println(Arrays.deepToString(yangHui));

        // 可以开始进行二维数组元素的赋值了
        // 2.1 从第一行开始,一维数组的首尾元素都是1
        for (int i = 0; i < yangHui.length; i++) {
            // 首元素赋值为1
            yangHui[i][0] = 1;
            // 尾元素赋值为1
            yangHui[i][yangHui[i].length - 1] = 1;
        }
        System.out.println(Arrays.deepToString(yangHui));

        // 2.2 从第三行开始,一维数组中除掉首尾元素的元素的赋值 = 上一行元素 + 上一行左边一列的元素
        // arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1];
        for (int i = 2; i < yangHui.length; i++) {
            for (int j = 1; j < yangHui[i].length - 1; j++) {
                // 两层for循环用于遍历二维数组中,每一个一维数组中的元素
                yangHui[i][j] = yangHui[i - 1][j] + yangHui[i - 1][j - 1];
            }
        }
        System.out.println(Arrays.deepToString(yangHui));

        // 以上,杨辉三角图案的数据,就已经存入二维数组了
        // 最后一步,按照杨辉三角的图案规律,打印出来即可
        for (int i = 0; i < yangHui.length; i++) {
            for (int j = 0; j < yangHui[i].length; j++) {
                System.out.print(yangHui[i][j]+"\t");
            }
            System.out.println();
        }
    }
}
